<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Utilizando Plugins - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/learning.plugins.usage.html">Inglês (English)</a></li>
    <li><a href="../pt-br/learning.plugins.usage.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="learning.plugins.intro.html">Introdu&ccedil;&atilde;o</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="learning.plugins.html">Plugins no Zend Framework</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="learning.plugins.conclusion.html">Conclus&atilde;o</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="learning.plugins.usage" class="section"><div class="info"><h1 class="title">Utilizando Plugins</h1></div>
    

    <p class="para">
        Componentes que fazem uso de plugins normalmente utilizam
        <span class="classname">Zend_Loader_PluginLoader</span>. Essa classe permite que você registre
        plugins especificando um ou mais &quot;caminhos prefixados&quot;. O componente irá chamar ao método
        de PluginLoader  <span class="methodname">load()</span>, passando o nome abreviado do plugin.
        O PluginLoader irá consultar cada caminho prefixado para saber se existe uma classe
        correspondente. Os caminhos prefixados são procurados na ordem LIFO (last in, first
        out - último a entrar, primeiro a sair), e com isso, as correspondências ocorrerão
        primeiramente com os últimos caminhos registrados - o que possibilita a você substituir
        plugins já existentes.
    </p>

    <p class="para">
        Os exemplos seguintes deixarão isso mais claro.
    </p>

    <div class="example" id="learning.plugins.usage.basic"><div class="info"><p><b>Example #1 Exemplo básico de Plugin: Adicionando um caminho prefixado</b></p></div>
        

        <div class="example-contents"><p>
            Neste exemplo, vamos supor que alguns validadores foram escritos e colocados no
            diretório <var class="filename">foo/plugins/validators/</var>, e que todas essas classes
            possuem o prefixo &quot;Foo_Validate_&quot;; essas duas partes de informação formam o
            &quot;caminho prefixado&quot;.
            Além disso, vamos supor que temos dois validadores, um chamado &quot;Par&quot; (garantindo que
            um número seja par), e outro chamado &quot;Dúzias&quot; (garantindo que o número é um múltiplo
            de 12). A árvore terá esta aparência:
        </p></div>

        <pre class="programlisting brush: text">
foo/
|-- plugins/
|   |-- validators/
|   |   |-- Par.php
|   |   |-- Duzias.php
</pre>


        <div class="example-contents"><p>
            Agora, vamos informar uma instância de <span class="classname">Zend_Form_Element</span>
            deste caminho prefixado. O método  <span class="methodname">addPrefixPath()</span> da classe
            <span class="classname">Zend_Form_Element</span> espera um terceiro argumento que indica
            o tipo de plugin para o qual o caminho está sendo registrado, neste caso, é um
            plugin &quot;validador&quot;.
        </p></div>

        <pre class="programlisting brush: php">
$element-&gt;addPrefixPath(&#039;Foo_Validate&#039;, &#039;foo/plugins/validators/&#039;, &#039;validate&#039;);
</pre>


        <div class="example-contents"><p>
            Agora podemos simplesmente informar ao elemento o nome abreviado dos validadores que
            queremos usar. No exemplo seguinte, usaremos uma mistura de validadores padrão
            (&quot;NotEmpty&quot;, &quot;Int&quot;) e validadores customizados (&quot;Par&quot;, &quot;Duzias&quot;):
        </p></div>

        <pre class="programlisting brush: php">
$element-&gt;addValidator(&#039;NotEmpty&#039;)
        -&gt;addValidator(&#039;Int&#039;)
        -&gt;addValidator(&#039;Par&#039;)
        -&gt;addValidator(&#039;Duzias&#039;);
</pre>


        <div class="example-contents"><p>
            Quando o elemento demanda validação, requisitará a classe de plugin através do
            PluginLoader. Os dois primeiros validadores serão
            <span class="classname">Zend_Validate_NotEmpty</span> e
            <span class="classname">Zend_Validate_Int</span>, respectivamente; os dois seguintes serão
            <span class="classname">Foo_Validate_Par</span> e <span class="classname">Foo_Validate_Duzias</span>,
            respectivamente.
        </p></div>
    </div>

    <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>O que acontece caso um plugin não seja encontrado?</b><br /></span>
        

        <p class="para">
            O que acontece se um plugin é solicitado, mas o PluginLoader é incapaz de encontrar
            uma classe correspondente? Por exemplo, no exemplo acima, se registrássemos o plugin
            &quot;Bar&quot;, com o elemento, o que aconteceria?
        </p>

        <p class="para">
            O carregador de plugin irá procurar em cada caminho prefixado, verificando se há um
            arquivo correspondente ao nome do plugin. Se o arquivo não for encontrado, ele passa
            ao próximo caminho prefixado.
        </p>

        <p class="para">
            Uma vez que a pilha de caminhos prefixados tenha se esgotado, caso nenhum arquivo
            tenha sido encontrado, será gerada uma exceção
            <span class="exceptionname">Zend_Loader_PluginLoader_Exception</span>.
        </p>
    </p></blockquote>

    <div class="example" id="learning.plugins.usage.override"><div class="info"><p><b>Example #2 Uso Intermediário do Plugin: Sobrescrevendo plugins existentes</b></p></div>
        

        <div class="example-contents"><p>
            Uma característica do PluginLoader é que seu uso da pilha LIFO permite sobrescrever
            plugins existentes, criando sua própria versão localmente com um caminho prefixado
            diferente e registrá-lo mais tarde na pilha.
        </p></div>

        <div class="example-contents"><p>
            Por exemplo, vamos considerar <span class="classname">Zend_View_Helper_FormButton</span>
            (auxiliares de visualização - view helpers - são um tipo de plugin). Esse auxiliar de
            visualização aceita três argumentos, um nome de elemento (também usado como seu
            identificador DOM), um valor (usado como o rótulo do botão) e um vetor opcional de
            atributos. O auxiliar gera marcação <acronym class="acronym">HTML</acronym> para um elemento de
            inserção em formulário.
        </p></div>

        <div class="example-contents"><p>
            Digamos que você deseja que o auxiliar, ao invés de gerar um elemento
            <b><tt>button</tt></b> em <acronym class="acronym">HTML</acronym>; não quer que o auxiliar
            gere um identificador DOM, mas sim utilizar o valor para um seletor de classe em CSS;
            sem interesse em manipular atributos arbitrários.
            Você pode fazer isso de algumas maneiras. Em todos os casos, você criaria sua própria
            classe &quot;auxiliar de visualização&quot; que implementa o comportamento desejado;
            a diferença está em como você iria nomeá-los e chamá-los.
        </p></div>

        <div class="example-contents"><p>
            Nosso primeiro exemplo será o de nomear o elemento com um nome único:
            <span class="classname">Foo_View_Helper_CssButton</span>, o que implica no nome do plugin
            &quot;CssButton&quot;. Embora isso seja uma abordagem viável, apresenta várias questões: caso
            você já tenha utilizado o auxiliar de visualização Button, você terá que refatorar;
            em outro caso, se outro desenvolvedor começar a escrever código para a sua aplicação,
            pode inadvertidamente usar o auxiliar de visualização Button em vez de seu novo
            auxiliar.
        </p></div>

        <div class="example-contents"><p>
            Então, o melhor exemplo é usar o plugin de nome &quot;Button&quot;, ficando o nome da classe
            como <span class="classname">Foo_View_Helper_Button</span>. Em seguida, registrar o caminho
            prefixado com a visualização (view):
        </p></div>

        <pre class="programlisting brush: php">
// Zend_View::addHelperPath() utiliza o PluginLoader; entretanto, inverte
// os argumentos e fornece o valor padrão de &quot;Zend_View_Helper&quot; para o
// prefixo de plugin.
//
// O código abaixo assume que sua classe está no diretório &#039;foo/view/helpers/&#039;.
$view-&gt;addHelperPath(&#039;foo/view/helpers&#039;, &#039;Foo_View_Helper&#039;);
</pre>


        <div class="example-contents"><p>
            Uma vez feito, em qualquer lugar que utilizar o auxiliar &quot;Button&quot; irá direcionar para
            a sua classe <span class="classname">Foo_View_Helper_Button</span> customizada!
        </p></div>
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="learning.plugins.intro.html">Introdu&ccedil;&atilde;o</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="learning.plugins.html">Plugins no Zend Framework</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="learning.plugins.conclusion.html">Conclus&atilde;o</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="learning.html">Conhecendo o Zend Framework</a></li>
  <li class="header up"><a href="learning.plugins.html">Plugins no Zend Framework</a></li>
  <li><a href="learning.plugins.intro.html">Introdu&ccedil;&atilde;o</a></li>
  <li class="active"><a href="learning.plugins.usage.html">Utilizando Plugins</a></li>
  <li><a href="learning.plugins.conclusion.html">Conclus&atilde;o</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>